home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
EvalMod2.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
29KB
|
1,136 lines
IMPLEMENTATION MODULE EvalMod2;
IMPORT SYSTEM, System, IO, Tree;
(* line 7 "" *)
FROM SYSTEM IMPORT ADR;
FROM IO IMPORT WriteS, WriteNl, WriteI, StdOutput;
FROM StringMem IMPORT WriteString;
FROM Idents IMPORT tIdent;
FROM Texts IMPORT WriteText;
FROM Sets IMPORT tSet, MakeSet, ReleaseSet, Include, Minimum, IsElement, WriteSet;
FROM Relations IMPORT IsRelated;
FROM TreeMod2 IMPORT WriteLine;
FROM EvalMod IMPORT EvalImplHead;
FROM Tree IMPORT
NoTree , tTree , Referenced , NoCodeClass ,
Computed , Reverse , Write , Read ,
Inherited , Synthesized , Input , Output ,
Stack , Parameter , Variable ,
CopyDef , CopyUse , Thread , Virtual ,
Test , Left , Right ,
NonBaseComp , First , Dummy , Trace ,
Demand , Funct , NoClass , Options ,
TreeRoot , iModule , iMain , itTree ,
ForallClasses, ForallAttributes, f , WI , WN ,
IdentifyAttribute, GrammarClass, cOAG , MaxVisit ,
WriteInstance;
VAR
Count, Start, Stop, Visit, ChildVisit, i, j, k : SHORTCARD;
Node, Attr, Class, AttrClass, Child, Child2, ChildsClass : tTree;
PROCEDURE Representative (i: CARDINAL): CARDINAL; (* Class *)
VAR
s : tSet;
r : CARDINAL;
Stable : BOOLEAN;
j, k : CARDINAL;
BEGIN
WITH Class^.Class DO
MakeSet (s, InstCount);
Include (s, i);
REPEAT
Stable := TRUE;
FOR j := 1 TO InstCount DO
IF IsElement (j, s) THEN
IF CopyDef IN Instance^[j].Properties THEN
k := Instance^[j].CopyArg;
IF (Parameter IN Instance^[k].Attribute^.Attribute.Properties) AND
NOT IsElement (k, s) THEN
Include (s, k);
Stable := FALSE;
END;
END;
IF CopyUse IN Instance^[j].Properties THEN
FOR k := 1 TO InstCount DO
IF (CopyDef IN Instance^[k].Properties) AND
(Parameter IN Instance^[k].Attribute^.Attribute.Properties) AND
(Instance^[k].CopyArg = j) AND
NOT IsElement (k, s) THEN
Include (s, k);
Stable := FALSE;
END;
END;
END;
END;
END;
UNTIL Stable;
r := Minimum (s);
IF r <= AttrCount THEN
Stable := TRUE;
j := r + 1;
LOOP
IF j > AttrCount THEN EXIT; END;
IF IsElement (j, s) THEN Stable := FALSE; EXIT; END;
INC (j);
END;
IF NOT Stable THEN
j := 1;
LOOP
k := Instance^ [j].Order;
IF (k <= AttrCount) AND IsElement (k, s) THEN r := k; EXIT; END;
INC (j);
END;
END;
END;
ReleaseSet (s);
RETURN r;
END;
END Representative;
PROCEDURE GenAttribute (i: CARDINAL; repr: BOOLEAN); (* Class = subtype, Node = current type, k *)
BEGIN
IF repr THEN
WITH Class^.Class.Instance^[i] DO
IF (Parameter IN Attribute^.Attribute.Properties) AND
(({CopyDef, CopyUse} * Properties) # {}) THEN
i := Representative (i);
END;
END;
END;
WITH Class^.Class.Instance^[i] DO
IF Virtual IN Properties THEN RETURN; END;
IF Left IN Properties THEN (* left *)
WITH Attribute^.Attribute DO
IF Parameter IN Properties THEN
IF IdentifyAttribute (Node, Name) = NoTree THEN
WI (Class^.Class.Name); WriteS (f, "yy"); WI (Name); (* local *)
ELSE
WriteS (f, "yy"); WI (Name); (* param *)
END;
ELSIF Demand IN Properties THEN (* demand *)
IF Funct IN Properties THEN
AttrClass := GetClass (Class, Name); (* function *)
WriteS (f, "y"); WI (AttrClass^.Class.Name); WriteS (f, "y"); WI (Name); WriteS (f, " (yyt)");
ELSIF i # k THEN
WI (Class^.Class.Name); WriteS (f, "yy"); WI (Name); (* local *)
ELSE
WriteS (f, "yy"); WI (Name); (* param *)
END;
ELSE (* tree *)
WriteS (f, "yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Name);
END;
END;
ELSE (* right *)
WITH Attribute^.Attribute DO
IF Parameter IN Properties THEN (* param *)
WI (Class^.Class.Name); WriteS (f, "y"); WI (Selector^.Child.Name); WriteS (f, "y"); WI (Name);
ELSIF Demand IN Properties THEN (* demand *)
IF Funct IN Properties THEN (* function *)
AttrClass := GetClass (Selector^.Child.Class, Name);
WriteS (f, "y"); WI (AttrClass^.Class.Name); WriteS (f, "y"); WI (Name);
WriteS (f, " (yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, ")");
ELSE
WI (Class^.Class.Name); WriteS (f, "y"); WI (Selector^.Child.Name); WriteS (f, "y"); WI (Name);
END;
ELSE (* tree *)
WriteS (f, "yyt^."); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "^."); WI (Selector^.Child.Type); WriteS (f, "."); WI (Name);
END;
END;
END;
END;
END GenAttribute;
PROCEDURE GetClass (Class: tTree; Attribute: tIdent): tTree;
BEGIN
WHILE Class^.Kind # NoClass DO
IF IdentifyAttribute (Class^.Class.Attributes, Attribute) # NoTree THEN RETURN Class; END;
Class := Class^.Class.BaseClass;
END;
RETURN NoTree;
END GetClass;
PROCEDURE CheckUsage (Usage: BITSET): BOOLEAN; (* Class, Child, Start, Stop *)
VAR i, i2: SHORTCARD;
BEGIN
FOR i := Start TO Stop DO
i2 := Class^.Class.Instance^ [i].Order;
WITH Class^.Class.Instance^ [i2] DO
IF ({Synthesized, Right, First} <= Properties) AND
(Child = Selector) AND
(Attribute^.Child.Partition <= Selector^.Child.Class^.Class.Visits) AND
(Attribute^.Child.Partition IN Usage) THEN
RETURN TRUE;
END;
IF ({Inherited, Right} <= Properties) AND (i2 = j) THEN
RETURN TRUE;
END;
END;
END;
RETURN FALSE;
END CheckUsage;
PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
BEGIN
IO.WriteS (IO.StdError, 'Error: module EvalMod2, routine ');
IO.WriteS (IO.StdError, yyFunction);
IO.WriteS (IO.StdError, ' failed');
IO.WriteNl (IO.StdError);
Exit;
END yyAbort;
PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
VAR yyi : INTEGER;
BEGIN
FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
END;
RETURN TRUE;
END yyIsEqual;
PROCEDURE EvalImplMod (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Ag) THEN
(* line 184 "" *)
WITH t^.Ag DO
(* line 184 "" *)
EvalImplHead (t);
IF NOT IsElement (ORD ('9'), Options) THEN
WriteNl (f);
WriteS (f, "PROCEDURE Eval (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR"); WriteNl (f);
Node := Classes;
Class := Classes;
ForallAttributes (Class, GenTemposLocal);
WriteS (f, " BEGIN");
IF MaxVisit > 0 THEN
Class := Classes;
Visit := 1;
WriteS (f, " yyVisit1"); WI (Class^.Class.Name); WriteS (f, " (yyt");
ForallAttributes (Class, GenActualsLeft);
WriteS (f, ");");
END;
WriteS (f, " END Eval;"); WriteNl (f);
ELSE
WriteNl (f);
WriteS (f, "VAR xxStack: CARDINAL;"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE Eval (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR xxHigh: BOOLEAN;"); WriteNl (f);
Node := Classes;
Class := Classes;
ForallAttributes (Class, GenTemposLocal);
WriteS (f, "BEGIN "); WriteNl (f);
WriteS (f, " xxStack := MAX (INTEGER);"); WriteNl (f);
IF MaxVisit > 0 THEN
Class := Classes;
Visit := 1;
WriteS (f, " yyVisit1"); WI (Class^.Class.Name); WriteS (f, " (yyt");
ForallAttributes (Class, GenActualsLeft);
WriteS (f, ");");
END; WriteNl (f);
WriteS (f, " IO.WriteS (IO.StdOutput, 'Stacksize ');"); WriteNl (f);
WriteS (f, " IO.WriteI (IO.StdOutput, CARDINAL (SYSTEM.ADR (xxHigh)) - xxStack, 0);"); WriteNl (f);
WriteS (f, " IO.WriteNl (IO.StdOutput);"); WriteNl (f);
WriteS (f, "END Eval;"); WriteNl (f);
END;
WriteNl (f);
ForallClasses (Classes, GenDemandProc);
ForallClasses (Classes, EvalImplMod);
WriteS (f, "PROCEDURE Begin"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteLine (EvalCodes^.Codes.BeginLine);
WriteText (f, EvalCodes^.Codes.Begin);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.BeginLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Begin);
Node := Node^.Module.Next;
END;
WriteS (f, " END Begin"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "PROCEDURE Close"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteLine (EvalCodes^.Codes.CloseLine);
WriteText (f, EvalCodes^.Codes.Close);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.CloseLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Close);
Node := Node^.Module.Next;
END;
WriteS (f, " END Close"); WI (EvalName); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
WriteS (f, "BEGIN"); WriteNl (f);
IF IsElement (ORD ('X'), Options) THEN
WriteS (f, " yyf := IO.StdOutput;"); WriteNl (f);
END;
WriteS (f, "END "); WI (EvalName); WriteS (f, "."); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Class) THEN
(* line 258 "" *)
WITH t^.Class DO
(* line 258 "" *)
IF (NoCodeClass * Properties) # {} THEN RETURN; END;
IF Referenced IN Properties THEN
Generated := 0;
ForallClasses (Extensions, Generated0);
FOR Visit := 1 TO Visits DO
WriteS (f, "PROCEDURE yyVisit"); WN (Visit); WI (Name); WriteS (f, " (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree);
Node := t;
Class := t;
ForallAttributes (t, GenFormals);
WriteS (f, ");"); WriteNl (f);
WriteS (f, " VAR yyTempo: RECORD CASE : INTEGER OF"); WriteNl (f);
Node := t;
GenTempos (t);
ForallClasses (Extensions, GenTempos);
WriteS (f, " END; END;"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " VAR xxLow: BOOLEAN;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " xxStack := General.Min (xxStack, CARDINAL (SYSTEM.ADR (xxLow)));"); WriteNl (f);
ELSE
WriteS (f, " BEGIN"); WriteNl (f);
END;
WriteS (f, " WITH yyTempo DO"); WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
IF cOAG IN GrammarClass THEN (* generate evaluator *)
Node := t;
GenEvaluator (t);
ForallClasses (Extensions, GenEvaluator);
END;
WriteS (f, " ELSE"); WriteNl (f);
IF IsElement (ORD ('Z'), Options) THEN
WriteS (f, " yyVisitParent (yyt);"); WriteNl (f);
END;
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END yyVisit"); WN (Visit); WI (Name); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
END;
END;
;
RETURN;
END;
END;
END EvalImplMod;
PROCEDURE WriteType (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 311 "" *)
WITH t^.Class DO
(* line 311 "" *)
IF (NoCodeClass * Properties) # {} THEN RETURN; END;
IF Trace IN Properties THEN
WriteS (f, "| "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ": yyWriteS ('"); WI (Name); WriteS (f, "');"); WriteNl (f);
END;
;
RETURN;
END;
END;
END WriteType;
PROCEDURE GenEvaluator (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
CASE t^.Kind OF
| Tree.Class:
(* line 321 "" *)
WITH t^.Class DO
(* line 321 "" *)
IF (NoCodeClass * Properties) # {} THEN RETURN; END;
IF (Generated = InstCount) THEN RETURN; END;
WriteS (f, "| "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
Start := Generated + 1;
LOOP
IF Generated = InstCount THEN EXIT; END;
INC (Generated);
WITH Instance^ [Instance^ [Generated].Order] DO
IF (Left IN Properties) AND (Attribute^.Child.Partition > Visit) THEN
DEC (Generated); EXIT;
END;
END;
END;
Stop := Generated;
Class := t;
FOR Start := Start TO Stop DO
i := Instance^ [Start].Order;
WITH Instance^ [i] DO
IF ({Inherited, Right, First} <= Properties) AND ({Dummy, Virtual, Demand} * Properties = {}) THEN
GenDemandEval (t);
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteEval (yyt, '"); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, "');"); WriteNl (f);
IF Action # ADR (Action) THEN GenEvaluator (Action); END; WriteNl (f);
IF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree); WriteS (f, " ("); GenAttribute (i, TRUE); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type); WriteS (f, " ("); GenAttribute (i, TRUE); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteEval (yyt, '"); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, "');"); WriteNl (f);
IF Action # ADR (Action) THEN GenEvaluator (Action); END;
ELSE
IF Action # ADR (Action) THEN GenEvaluator (Action); END;
END;
END;
IF ({Synthesized, Left, First} <= Properties) AND ({Dummy, Virtual, Demand} * Properties = {}) THEN
GenDemandEval (t);
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteEval (yyt, '"); WI (Attribute^.Child.Name); WriteS (f, "');"); WriteNl (f);
IF Action # ADR (Action) THEN GenEvaluator (Action); END; WriteNl (f);
IF Test IN Properties THEN
WriteS (f, "writeBOOLEAN (yyb) yyWriteNl;"); WriteNl (f);
ELSIF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree); WriteS (f, " ("); GenAttribute (i, TRUE); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type); WriteS (f, " ("); GenAttribute (i, TRUE); WriteS (f, ") yyWriteNl;"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteEval (yyt, '"); WI (Attribute^.Child.Name); WriteS (f, "');"); WriteNl (f);
IF Action # ADR (Action) THEN GenEvaluator (Action); END;
ELSE
IF Action # ADR (Action) THEN GenEvaluator (Action); END;
END;
END;
IF ({Synthesized, Right, First} <= Properties) AND
(Attribute^.Child.Partition <= Selector^.Child.Class^.Class.Visits) THEN
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyWriteVisit (yyt, '"); WI (Selector^.Child.Name); WriteS (f, " ");
WN (Attribute^.Child.Partition); WriteS (f, "');"); WriteNl (f);
END;
ChildVisit := Attribute^.Child.Partition;
Child := Selector;
WriteS (f, "yyVisit"); WN (ChildVisit); WI (Child^.Child.Type);
WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Child^.Child.Name);
ForallAttributes (Child^.Child.Class, GenActualsRight);
WriteS (f, ");"); WriteNl (f);
END;
END;
END;
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyVisitParent (yyt);"); WriteNl (f);
END;
;
RETURN;
END;
| Tree.Assign:
(* line 398 "" *)
WITH t^.Assign DO
(* line 398 "" *)
WriteLine (Pos);
GenEvaluator (Results); WriteS (f, ":="); GenEvaluator (Arguments); WriteS (f, ";"); WriteNl (f);
;
RETURN;
END;
| Tree.Copy:
(* line 402 "" *)
WITH t^.Copy DO
(* line 402 "" *)
j := Class^.Class.Instance^[i].CopyArg;
IF (Parameter IN Class^.Class.Instance^[i].Attribute^.Attribute.Properties) AND
(Parameter IN Class^.Class.Instance^[j].Attribute^.Attribute.Properties) THEN
IF (Left IN Class^.Class.Instance^[i].Properties) AND
(Left IN Class^.Class.Instance^[j].Properties) THEN
WriteLine (Pos);
GenAttribute (i, FALSE); WriteS (f, " :="); GenEvaluator (Arguments); WriteS (f, ";"); WriteNl (f);
END;
ELSE
WriteLine (Pos);
GenEvaluator (Results); WriteS (f, ":="); GenEvaluator (Arguments); WriteS (f, ";"); WriteNl (f);
END;
;
RETURN;
END;
| Tree.TargetCode:
(* line 417 "" *)
WITH t^.TargetCode DO
(* line 417 "" *)
WriteLine (Pos);
GenEvaluator (Code); WriteNl (f);
;
RETURN;
END;
| Tree.Check:
(* line 421 "" *)
WITH t^.Check DO
(* line 421 "" *)
WriteLine (Pos);
IF Condition # NoTree THEN
IF IsElement (ORD ('X'), Options) THEN
WriteS (f, "yyb := "); GenEvaluator (Condition); WriteS (f, "; IF NOT yyb THEN ");
ELSE
WriteS (f, "IF NOT ("); GenEvaluator (Condition); WriteS (f, ") THEN ");
END;
GenEvaluator (Statement); WriteNl (f);
IF Actions^.Kind = Tree.Check THEN
WriteS (f, "ELSE "); GenEvaluator (Actions);
END;
WriteS (f, " END;"); WriteNl (f);
ELSE
IF IsElement (ORD ('X'), Options) THEN
WriteS (f, "yyb := FALSE; ");
END;
GenEvaluator (Statement); WriteS (f, ";"); WriteNl (f);
GenEvaluator (Actions);
END;
;
RETURN;
END;
| Tree.Designator:
(* line 442 "" *)
WITH t^.Designator DO
(* line 442 "" *)
Child2 := IdentifyAttribute (Class, Selector);
IF Child2 # NoTree THEN
ChildsClass := Child2^.Child.Class;
Attr := IdentifyAttribute (ChildsClass, Attribute);
IF Attr # NoTree THEN
GenAttribute (Class^.Class.AttrCount + Child2^.Child.InstOffset + Attr^.Attribute.AttrIndex, TRUE);
ELSE
WI (Selector); WriteS (f, ":"); WI (Attribute);
END;
ELSE
WI (Selector); WriteS (f, ":"); WI (Attribute);
END;
GenEvaluator (Next);
;
RETURN;
END;
| Tree.Ident:
(* line 457 "" *)
WITH t^.Ident DO
(* line 457 "" *)
Attr := IdentifyAttribute (Class, Attribute);
IF Attr # NoTree THEN
GenAttribute (Attr^.Attribute.AttrIndex, TRUE);
ELSE
WI (Attribute);
END;
GenEvaluator (Next);
;
RETURN;
END;
| Tree.Any:
(* line 466 "" *)
WITH t^.Any DO
(* line 466 "" *)
WriteString (f, Code);
GenEvaluator (Next);
;
RETURN;
END;
| Tree.Anys:
(* line 470 "" *)
WITH t^.Anys DO
(* line 470 "" *)
GenEvaluator (Layouts);
GenEvaluator (Next);
;
RETURN;
END;
| Tree.LayoutAny:
(* line 474 "" *)
WITH t^.LayoutAny DO
(* line 474 "" *)
WriteString (f, Code);
GenEvaluator (Next);
;
RETURN;
END;
ELSE END;
END GenEvaluator;
PROCEDURE Generated0 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 482 "" *)
WITH t^.Class DO
(* line 482 "" *)
Generated := 0;
;
RETURN;
END;
END;
END Generated0;
PROCEDURE GenFormals (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 489 "" *)
WITH t^.Attribute DO
(* line 489 "" *)
IF (Parameter IN Properties) AND (Visit IN Usage) THEN
WriteS (f, "; VAR "); GenAttribute (AttrIndex, FALSE); WriteS (f, ": "); WI (Type);
END;
;
RETURN;
END;
END;
END GenFormals;
PROCEDURE GenActualsRight (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 498 "" *)
WITH t^.Attribute DO
(* line 498 "" *)
IF (Parameter IN Properties) AND (ChildVisit IN Usage) THEN
WriteS (f, ", "); GenAttribute (Class^.Class.AttrCount + Child^.Child.InstOffset + AttrIndex, TRUE);
END;
;
RETURN;
END;
END;
END GenActualsRight;
PROCEDURE GenActualsLeft (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 507 "" *)
WITH t^.Attribute DO
(* line 507 "" *)
IF (Parameter IN Properties) AND (Visit IN Usage) THEN
WriteS (f, ", "); GenAttribute (AttrIndex, FALSE);
END;
;
RETURN;
END;
END;
END GenActualsLeft;
PROCEDURE GenTempos (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 516 "" *)
WITH t^.Class DO
(* line 516 "" *)
IF (NoCodeClass * Properties) # {} THEN RETURN; END;
Start := Generated + 1;
LOOP
IF Generated = InstCount THEN EXIT; END;
INC (Generated);
WITH Instance^ [Instance^ [Generated].Order] DO
IF (Left IN Properties) AND (Attribute^.Child.Partition > Visit) THEN
DEC (Generated); EXIT;
END;
END;
END;
Stop := Generated;
Generated := Start - 1;
Count := 0;
Class := t;
ForallAttributes (t, CountTempos);
IF Count > 0 THEN
WriteS (f, " | "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
Class := t;
ForallAttributes (t, GenTempos);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 540 "" *)
WITH t^.Child DO
(* line 540 "" *)
Child := t;
ForallAttributes (Class, GenTemposChildren);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 544 "" *)
WITH t^.Attribute DO
(* line 544 "" *)
IF (Parameter IN Properties) AND (IdentifyAttribute (Node, Name) = NoTree) AND (Visit IN Usage) OR
(Demand IN Properties) AND NOT (Funct IN Properties) AND (AttrIndex # k) THEN
WriteS (f, " "); GenAttribute (AttrIndex, FALSE); WriteS (f, ": "); WI (Type); WriteS (f, ";"); WriteNl (f);
END;
;
RETURN;
END;
END;
END GenTempos;
PROCEDURE GenTemposChildren (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 554 "" *)
WITH t^.Attribute DO
(* line 554 "" *)
IF (Parameter IN Properties) OR
(Demand IN Properties) AND NOT (Funct IN Properties) THEN
j := Class^.Class.AttrCount + Child^.Child.InstOffset + AttrIndex;
IF (Demand IN Properties) OR
(({CopyDef, CopyUse} * Class^.Class.Instance^[j].Properties) = {}) OR
(j = Representative (j)) THEN
IF CheckUsage (Usage) THEN
WriteS (f, " "); GenAttribute (j, FALSE); WriteS (f, ": "); WI (Type); WriteS (f, ";"); WriteNl (f);
END;
END;
END;
;
RETURN;
END;
END;
END GenTemposChildren;
PROCEDURE CountTempos (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Child) THEN
(* line 571 "" *)
WITH t^.Child DO
(* line 571 "" *)
Child := t;
ForallAttributes (Class, CountTemposChildren);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 575 "" *)
WITH t^.Attribute DO
(* line 575 "" *)
IF (Parameter IN Properties) AND (IdentifyAttribute (Node, Name) = NoTree) AND (Visit IN Usage) OR
(Demand IN Properties) AND NOT (Funct IN Properties) AND (AttrIndex # k) THEN
INC (Count);
END;
;
RETURN;
END;
END;
END CountTempos;
PROCEDURE CountTemposChildren (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 585 "" *)
WITH t^.Attribute DO
(* line 585 "" *)
IF (Parameter IN Properties) OR
(Demand IN Properties) AND NOT (Funct IN Properties) THEN
j := Class^.Class.AttrCount + Child^.Child.InstOffset + AttrIndex;
IF (Demand IN Properties) OR
(({CopyDef, CopyUse} * Class^.Class.Instance^[j].Properties) = {}) OR
(j = Representative (j)) THEN
IF CheckUsage (Usage) THEN INC (Count); END;
END;
END;
;
RETURN;
END;
END;
END CountTemposChildren;
PROCEDURE GenTemposLocal (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 600 "" *)
WITH t^.Attribute DO
(* line 600 "" *)
IF Parameter IN Properties THEN
WriteS (f, " "); GenAttribute (AttrIndex, FALSE); WriteS (f, ": "); WI (Type); WriteS (f, ";"); WriteNl (f);
END;
;
RETURN;
END;
END;
END GenTemposLocal;
PROCEDURE GenDemandProc (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 609 "" *)
WITH t^.Class DO
(* line 609 "" *)
IF (NoCodeClass * Properties) # {} THEN RETURN; END;
Node := t;
ForallAttributes (Attributes, GenDemandProc);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 614 "" *)
WITH t^.Attribute DO
(* line 614 "" *)
IF Demand IN Properties THEN
Class := Node;
k := AttrIndex;
IF Funct IN Properties THEN
WriteS (f, "PROCEDURE y"); WI (Class^.Class.Name); WriteS (f, "y"); WI (Name);
WriteS (f, " (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, "): "); WI (Type); WriteS (f, ";"); WriteNl (f);
ELSE
WriteS (f, "PROCEDURE y"); WI (Class^.Class.Name); WriteS (f, "y"); WI (Name);
WriteS (f, " (yyt: "); WI (iMain); WriteS (f, "."); WI (itTree); WriteS (f, "; VAR "); GenAttribute (AttrIndex, FALSE); WriteS (f, ": "); WI (Type); WriteS (f, ");"); WriteNl (f);
END;
WriteS (f, " VAR yyTempo: RECORD CASE : INTEGER OF"); WriteNl (f);
GenTempos (Class);
ForallClasses (Class^.Class.Extensions, GenTempos);
WriteS (f, " END; END;"); WriteNl (f);
WriteS (f, " BEGIN"); WriteNl (f);
WriteS (f, " WITH yyTempo DO"); WriteNl (f);
WriteS (f, " CASE yyt^.Kind OF"); WriteNl (f);
IF cOAG IN GrammarClass THEN
i := AttrIndex;
Class := Node;
GenDemandProc2 (Class);
ForallClasses (Class^.Class.Extensions, GenDemandProc2);
Class := Node;
END;
WriteS (f, " ELSE"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END;"); WriteNl (f);
WriteS (f, " END y"); WI (Class^.Class.Name); WriteS (f, "y"); WI (Name); WriteS (f, ";"); WriteNl (f);
WriteNl (f);
k := 0;
END;
;
RETURN;
END;
END;
END GenDemandProc;
PROCEDURE GenDemandProc2 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 651 "" *)
WITH t^.Class DO
(* line 651 "" *)
WriteS (f, "| "); WI (iMain); WriteS (f, "."); WI (Name); WriteS (f, ":"); WriteNl (f);
WITH Instance^ [i] DO
Class := t;
GenDemandEval (t);
IF Funct IN Properties THEN
GenDemandProc2 (Action);
ELSE
GenEvaluator (Action); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Assign) THEN
(* line 663 "" *)
WITH t^.Assign DO
(* line 663 "" *)
WriteS (f, "RETURN "); GenEvaluator (Arguments); WriteS (f, ";"); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Copy) THEN
(* line 666 "" *)
WITH t^.Copy DO
(* line 666 "" *)
WriteS (f, "RETURN "); GenEvaluator (Arguments); WriteS (f, ";"); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.TargetCode) THEN
(* line 669 "" *)
WITH t^.TargetCode DO
(* line 669 "" *)
WriteS (f, "NoBlockStatementForDemandFunctionAttributes;"); WriteNl (f);
;
RETURN;
END;
END;
END GenDemandProc2;
PROCEDURE GenDemandEval (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 676 "" *)
WITH t^.Class DO
(* line 676 "" *)
FOR j := 1 TO InstCount DO
WITH Instance^ [j] DO
IF IsRelated (i, j, DP) AND
(Demand IN Properties) AND NOT (Funct IN Properties) THEN
IF Left IN Properties THEN
AttrClass := GetClass (t, Attribute^.Child.Name);
WriteS (f, " y"); WI (AttrClass^.Class.Name); WriteS (f, "y"); WI (Attribute^.Child.Name);
WriteS (f, " (yyt, "); GenAttribute (j, FALSE); WriteS (f, ");"); WriteNl (f);
ELSE
AttrClass := GetClass (Selector^.Child.Class, Attribute^.Child.Name);
WriteS (f, " y"); WI (AttrClass^.Class.Name); WriteS (f, "y"); WI (Attribute^.Child.Name);
WriteS (f, " (yyt^."); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, ", "); GenAttribute (j, FALSE); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
;
RETURN;
END;
END;
END GenDemandEval;
PROCEDURE BeginEvalMod2;
BEGIN
(* line 180 "" *)
k := 0;
END BeginEvalMod2;
PROCEDURE CloseEvalMod2;
BEGIN
END CloseEvalMod2;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
yyf := IO.StdOutput;
Exit := yyExit;
BeginEvalMod2;
END EvalMod2.